#include "array.h"
#include "mytools.h"
#include <stdio.h>
#include <string.h>

/// @brief declaration of array
/// @details This function is used to declare an array.
///
/// [ static(可选) 限定符 (可选) 表达式 (可选) ] 属性说明符序列 (可选)  (1)
/// [ 限定符 (可选) static(可选) 表达式 (可选) ] 属性说明符序列 (可选)  (2)
/// [ 限定符 (可选) * ] 属性说明符序列 (可选)  (3)
void array_declaration() {
  print_title("Array declaration");
  {
    // 已知常量大小的数组
    int arr[5] = {1, 2, 3, 4, 5};
    char o[sizeof(double)];
    enum { SIZE = 10 };
    int arr2[SIZE]; // 枚举常量是常量表达式
  }
  {
    // 已知大小，可以用初始化器
    int arr3[] = {1, 2, 3, 4, 5};
    char str[] = "Hello, world!";
  }
  {
    // 非常量大小的数组, 需要可计算的表达式
    for (int i = 0; i < 10; i++) {
      int arr[i];
      printf("Size of arr[%d] = %lu\n", i, sizeof(arr));
    }
  }
  {
    // typedef 声明数组
    typedef int A[3][4];
    A arr = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    // 打印 arr[1][2]
    printf("arr[1][2] = %d\n", arr[1][2]);
  }
  {
    // 多维数组转换
    int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int(*p1)[3] = a; // a 是二维数组，p1 是指向二维数组的指针
    int p2[3];

    for (int i = 0; i < sizeof(*p1) / sizeof((*p1)[0]); i++) {
      printf("(*p1)[%d] = %d\n", i, (*p1)[i]);
    }
    printf("\n");

    for (int i = 0; i < sizeof(p2) / sizeof(p2[0]); i++) {
      p2[i] = a[0][i];
      printf("p2[%d] = %d\n", i, p2[i]);
    }
    printf("\n");
  }
}